home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Reference / the cmsp digests ('94-'97) / csmp digest Vol 3 No 084 < prev    next >
Text File  |  1995-02-16  |  41KB  |  1,168 lines

  1. C.S.M.P. Digest             Thu, 16 Feb 95       Volume 3 : Issue 84
  2.  
  3. Today's Topics:
  4.  
  5.         A portable random generator
  6.         Dlog code snippet request
  7.         FindWorkBreaks quirky?
  8.         Looking for Get-Put URL AE suite info
  9.         Random() replacement anyone?
  10.         UnloadSeg - unloading code segments
  11.         Where to send applications I've written?
  12.  
  13.  
  14.  
  15. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  16. (pottier@clipper.ens.fr).
  17.  
  18. The digest is a collection of article threads from the internet newsgroup
  19. comp.sys.mac.programmer.  It is designed for people who read c.s.m.p. semi-
  20. regularly and want an archive of the discussions.  If you don't know what a
  21. newsgroup is, you probably don't have access to it.  Ask your systems
  22. administrator(s) for details.  If you don't have access to news, you may
  23. still be able to post messages to the group by using a mail server like
  24. anon.penet.fi (mail help@anon.penet.fi for more information).
  25.  
  26. Each issue of the digest contains one or more sets of articles (called
  27. threads), with each set corresponding to a 'discussion' of a particular
  28. subject.  The articles are not edited; all articles included in this digest
  29. are in their original posted form (as received by our news server at
  30. nef.ens.fr).  Article threads are not added to the digest until the last
  31. article added to the thread is at least two weeks old (this is to ensure that
  32. the thread is dead before adding it to the digest).  Article threads that
  33. consist of only one message are generally not included in the digest.
  34.  
  35. The digest is officially distributed by two means, by email and ftp.
  36.  
  37. If you want to receive the digest by mail, send email to listserv@ens.fr
  38. with no subject and one of the following commands as body:
  39.     help                                Sends you a summary of commands
  40.     subscribe csmp-digest Your Name     Adds you to the mailing list
  41.     signoff csmp-digest                 Removes you from the list
  42. Once you have subscribed, you will automatically receive each new
  43. issue as it is created.
  44.  
  45. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
  46. Questions related to the ftp site should be directed to
  47. scott.silver@dartmouth.edu. Currently no previous volumes of the CSMP
  48. digest are available there.
  49.  
  50. Also, the digests are available to WAIS users.  To search back issues
  51. with WAIS, use comp.sys.mac.programmer.src. With Mosaic, use
  52. http://www.wais.com/wais-dbs/comp.sys.mac.programmer.html.
  53.  
  54.  
  55. -------------------------------------------------------
  56.  
  57. >From vecoven@montefiore.ulg.ac.be (Frederic Vecoven)
  58. Subject: A portable random generator
  59. Date: Wed, 1 Feb 1995 09:22:52 +0100
  60. Organization: Universiti de Lihge
  61.  
  62. After reading lots of message about random numbers, I post
  63. this generator for those interested. It's quite good (the pseudo-
  64. period is very high) and portable.
  65.  
  66. #define M1      259200
  67. #define IA1     7141
  68. #define IC1     54773
  69. #define RM1     (1.0 / M1)
  70. #define M2      134456
  71. #define IC2     28411
  72. #define RM2     (1.0 / M2)
  73. #define M3      243000
  74. #define IA3     4561
  75. #define IC3     51349
  76.  
  77. /* initialize the pseudo-sequence with a integer <= 0 */
  78. double ran1(idum)
  79. int *idum;
  80. {
  81.         static long     ix1,ix2,ix3;
  82.         static int      iff = 0;
  83.         static double   r[98];
  84.         double          temp;
  85.         int             j;
  86.  
  87.         if (*idum < 0 || iff == 0) {
  88.                 iff = 1;
  89.                 ix1 = (IC1 - (*idum)) % M1;
  90.                 ix1 = (IA1 * ix1 + IC1) % M1;
  91.                 ix2 = ix1 % M2;
  92.                 ix1 = (IA1 * ix1 + IC1) % M1;
  93.                 ix3 = ix1 % M3;
  94.                 for (j=1;j<97;j++) {
  95.                         ix1 = (IA1 * ix1 + IC1) % M1;
  96.                         ix2 = (IA2 * ix2 + IC2) % M2;
  97.                         r[j] = (ix1 + ix2 * RM2) * RM1;
  98.                 }
  99.                 *idum = 1;
  100.         }
  101.         ix1 = (IA1 * ix1 + IC1) % M1;
  102.         ix2 = (IA2 * ix2 + IC2) % M2;
  103.         ix3 = (IA3 * ix3 + IC3) % M3;
  104.         j = 1 + ((97 * ix3) / M3);
  105.         if (j > 97 || j < 1) exit(1);
  106.         temp = r[j];
  107.         r[j] = (ix1 + ix2 * RM2) * RM1;
  108.         return (2.0 * temp - 1.0);
  109. }
  110.  
  111.  
  112. --
  113.           \__/      \__/           ***********************************************
  114.           (@@)      (@@)           * Frederic Vecoven - Researcher               *
  115.          //||\\    //||\\          * Department of microelectronics              *
  116.                                    * Institut Montefiore B28 - 4000 Liege        *
  117.      \__/      \__/      \__/      * University of Liege - Belgium               *
  118.      (oo)      (oo)      (oo)      * Phone: (32)-41-662631   Fax: (32)-41-662950 *
  119.     //||\\    //||\\    //||\\     *                                             *
  120.                                    * E-mail : vecoven@montefiore.ulg.ac.be       *
  121.          FIGHTER CAPTURED !        * http://www.montefiore.ulg.ac.be/~vecoven/   *
  122.                                    ***********************************************
  123.  
  124.  
  125. ---------------------------
  126.  
  127. >From richard@genome.wi.mit.edu (Richard Resnick)
  128. Subject: Dlog code snippet request
  129. Date: 30 Jan 1995 15:19:25 GMT
  130. Organization: Whitehead Institute for Biomedical Research
  131.  
  132. Hello,
  133.  
  134. I've got a dialog box where I need an editable text item that accepts
  135. strings bigger than 255 characters. GetDItem, followed by GetIText,
  136. will snip off anything beyond the 255th character. Does anybody have a
  137. snippet for how to handle this situation? I'm writing the interface in
  138. pascal, so I'd appreciate Pascal code, but I'll take C if there's
  139. nothing else.
  140.  
  141. Thanks in advance,
  142.  
  143. Richard
  144. --
  145. Richard Resnick                  Center for Genome Research
  146. richard@genome.wi.mit.edu        The Whitehead Institute, MIT
  147.              Keyboardist -- The Brad Paisley Trio
  148.  
  149.  
  150. +++++++++++++++++++++++++++
  151.  
  152. >From rmah@panix.com (Robert Mah)
  153. Date: Mon, 30 Jan 1995 23:15:46 -0500
  154. Organization: One Step Beyond
  155.  
  156. [ crossposted to comp.sys.mac.programmer.help and alt.sources.mac with
  157.   followup's set to comp.sys.mac.programmer.help ]
  158.  
  159. richard@genome.wi.mit.edu (Richard Resnick) wrote:
  160. ) I've got a dialog box where I need an editable text item that accepts
  161. ) strings bigger than 255 characters.  GetDItem, followed by GetIText,
  162. ) will snip off anything beyond the 255th character. Does anybody have a
  163. ) snippet for how to handle this situation?
  164.  
  165. Every edit text or static text item is represented by a handle to the
  166. text it contains.  So, just move the text you want into that handle.
  167. The only caveat is that you have to check if you are modifying the 
  168. current edit text field.  You may have to manually call DrawDialog()
  169. after this, but I can't remember.
  170.  
  171. Try the following (sorry for the lack of comments, but I typed this
  172. off the cuff)...
  173.  
  174.  
  175. OSErr
  176. SetDlogItemTextHdl( const DialogPtr dlog,
  177.                     short           item,
  178.                     const Handle    textHdl )
  179. {
  180.     char  hstate;
  181.     OSErr err;
  182.     Size  textLen;
  183.  
  184.     hstate = HGetState( textHdl );
  185.     HLock( textHdl );
  186.  
  187.     textLen = GetHandleSize( textHdl );
  188.     err = SetDlogItemTextPtr( dlog, item, *textHdl, textLen );
  189.  
  190.     HSetState( textHdl, hstate );
  191.     return err;
  192. }
  193.  
  194.  
  195. OSErr
  196. SetDlogItemTextPtr( const DialogPtr dlog,
  197.                     short           item, 
  198.                     const char      *textPtr,
  199.                     Size            textLen )
  200. {
  201.     DialogPeek  dpeek;
  202.     short       itemType;
  203.     Rect        itemBox;
  204.     Handle      itemHdl;
  205.     TEHandle    teHdl;
  206.  
  207.     GetDialogItem( dlog, item, &itemType, &textHdl, &itemBox );
  208.     if( itemHdl == NULL )
  209.         return -1;
  210.  
  211.     SetHandleSize( itemHdl, textLen );
  212.     if( (err = MemError()) != noErr )
  213.         return err;
  214.  
  215.     BlockMoveData( textPtr, *itemHdl, textLen ); 
  216.  
  217.     dpeek = (DialogPeek)dlog;
  218.     if( dpeek->editField == item - 1 ){
  219.         teHdl = dpeek->textH;
  220.         if( teHdl != NULL ){
  221.             TESetText( textPtr, textLen, teHdl );
  222.             TECalText( teHdl );
  223.         }
  224.     }
  225.     return noErr;
  226. }
  227.  
  228. Cheers,
  229. Rob
  230. _______________________________________________________________________
  231. Robert S. Mah        Macintosh Software Development     +1 212 947 6507
  232. One Step Beyond         and Network Consulting           rmah@panix.com
  233.  
  234. +++++++++++++++++++++++++++
  235.  
  236. >From altworld@panix.com (Robert Schmunk)
  237. Date: 31 Jan 1995 12:05:08 -0500
  238. Organization: PANIX Public Access Internet and Unix, NYC
  239.  
  240. richard@genome.wi.mit.edu (Richard Resnick) wrote:
  241. ) I've got a dialog box where I need an editable text item that accepts
  242. ) strings bigger than 255 characters.  GetDItem, followed by GetIText,
  243. ) will snip off anything beyond the 255th character. Does anybody have a
  244. ) snippet for how to handle this situation?
  245.  
  246. There is a sample code snippet called Modal Text Edit which handles
  247. this located on the Apple Bookmark CDs that come with a "develop"
  248. subscription. The snippet should also be available in the on-line
  249. archives at ftp.apple.com somewhere in the dts directory.
  250.  
  251. rbs
  252. -- 
  253. Robert B. Schmunk
  254. altworld@panix.com, pcrxs@nasagiss.giss.nasa.gov
  255. http://barsoom.giss.nasa.gov/People/Schmunk.html
  256.  
  257. ---------------------------
  258.  
  259. >From Lewis Gordon Pringle, Jr. <lewis@sophists.com>
  260. Subject: FindWorkBreaks quirky?
  261. Date: 26 Jan 1995 22:04:35 GMT
  262. Organization: Sophist Solutions, Inc.
  263.  
  264.  
  265.         I'm using the TextUtils toolbox routine FindWordBreaks() in order to
  266. word-wrap some text for a texteditor I'm writing. This routine seems to do
  267. just what I need - and the documentation indicates that it is intended to
  268. be used for such things as word-wrapping text.
  269.         
  270.         However - it has one very disturbing anomoly. It seems to condider a space
  271. character to be a word!
  272.         
  273.         That is - if you operate on the text "We are good", and ask it to find the
  274. word at position 2, it responds with a word found (2,3).
  275.         
  276.         This would be awkward - but acceptable - if only the routine notified
  277. me somehow which "words" were REALLY words - and which were simply strings
  278. of spaces.
  279.         
  280.         Now - I can use isspace() (from ctype.h) to tell if the word returned is a
  281. REAL word - or one of these phony ones. This is what I am doing for now.
  282. But doesn't this negate the usefulness of using this routine to begin with?
  283. After all - it would then miss the case of - for example - a double-byte
  284. Kanji space.
  285.         
  286.         So - big picture - is this the right routine to be using to word-wrap text
  287. in an internationally friendly manner? Assuming it is - then how do I use
  288. it to achieve this?
  289.  
  290.                         Thanx,
  291.         
  292.                                                 Lewis.
  293.  
  294.  
  295.  
  296. - -----------------------------------------------------------------------------
  297. Lewis Gordon Pringle, Jr.                          e-mail: <lewis@sophists.com>
  298. Software Consultant                                 phone:       (508)-543-0041
  299.  
  300. Dogbert: "Always postpone meetings with time-wasting morons."
  301. Dilbert: "How do you do that?"
  302. Dogbert: "Can I get back to you on that?"     -- Scott Adams
  303.  
  304. +++++++++++++++++++++++++++
  305.  
  306. >From paitech@hntp2.hinet.net (Pai Technology)
  307. Date: 26 Jan 1995 23:39:24 GMT
  308. Organization: HiNet
  309.  
  310. LewisGordonPringle wrote:
  311. :       That is - if you operate on the text "We are good", and ask it to find the
  312. : word at position 2, it responds with a word found (2,3).
  313.  
  314. One of the 7 parameters of FindWordBreaks is "leadingEdge".  It tells
  315. FindWordBreaks whether you want to find the word before the offset or after
  316. the offset.  In this case, you have to pass false to leadingEdge.
  317.  
  318. :       Now - I can use isspace() (from ctype.h) to tell if the word returned is a
  319. : REAL word - or one of these phony ones. This is what I am doing for now.
  320. : But doesn't this negate the usefulness of using this routine to begin with?
  321. : After all - it would then miss the case of - for example - a double-byte
  322. : Kanji space.
  323.  
  324. You can use the Script Manager routine CharacterType() to distinguish the
  325. spaces.
  326.  
  327. Hao-yang Wang
  328. Pai Technology, Inc.
  329. Taipei
  330.  
  331. +++++++++++++++++++++++++++
  332.  
  333. >From presnick@qualcomm.com (Pete Resnick)
  334. Date: Thu, 26 Jan 1995 18:02:15 -0600
  335. Organization: QUALCOMM Incorporated
  336.  
  337. In article <3g969j$t3n@sundog.tiac.net>, Lewis Gordon Pringle, Jr.
  338. <lewis@sophists.com> wrote:
  339.  
  340. >        I'm using the TextUtils toolbox routine FindWordBreaks() in order to
  341. >word-wrap some text for a texteditor I'm writing. This routine seems to do
  342. >just what I need - and the documentation indicates that it is intended to
  343. >be used for such things as word-wrapping text.
  344.  
  345. If you are using it to word-wrap text, you might consider calling
  346. StyledLineBreak instead. It finds the appropriate place to break a line
  347. for wrapping by calling PixelToChar and FindWordBreaks and then looking
  348. for trailing spaces on the line.
  349.  
  350. >        This would be awkward - but acceptable - if only the routine notified
  351. >me somehow which "words" were REALLY words - and which were simply strings
  352. >of spaces.
  353. >        
  354. >Now - I can use isspace() (from ctype.h) to tell if the word returned is a
  355. >REAL word - or one of these phony ones. This is what I am doing for now.
  356. >But doesn't this negate the usefulness of using this routine to begin with?
  357. >After all - it would then miss the case of - for example - a double-byte
  358. >Kanji space.
  359.  
  360. Here's a routine that does this for you:
  361.  
  362. /* Check to see if the given text is all whitespace */
  363. Boolean IsWhitespace(StringPtr theText, long textLen)
  364. {
  365.     short theType;
  366.     
  367.     /* Go through the characters of the text */
  368.     while(textLen > 0L) {
  369.         /* Get the character type for the current character */
  370.         theType = CharacterType((Ptr)theText++, 0, smCurrentScript);
  371.         
  372.         /* If this is a two byte character, move through to the next byte */
  373.         if((theType & smcDoubleMask) != smChar1byte) {
  374.             ++theText;
  375.             --textLen;
  376.         }
  377.  
  378.         /* Check to see if it's whitespace */
  379.         theType &= (smcTypeMask | smcClassMask);
  380.         if(theType != (smCharPunct | smPunctBlank)) {
  381.             return false;
  382.         }
  383.         --textLen;
  384.     }
  385.     
  386.     /* If it got this far, it was all whitespace */
  387.     return true;
  388. }
  389.  
  390. Hope that helps.
  391. -- 
  392. Pete Resnick - presnick@qualcomm.com
  393. QUALCOMM Incorporated
  394.  
  395. +++++++++++++++++++++++++++
  396.  
  397. >From Lewis Gordon Pringle, Jr. <lewis@sophists.com>
  398. Date: 29 Jan 1995 04:47:01 GMT
  399. Organization: Sophist Solutions, Inc.
  400.  
  401. In article <3g9brc$lmu@serv.hinet.net>, you write:
  402. >From: paitech@hntp2.hinet.net (Pai Technology)
  403. >Newsgroups: comp.sys.mac.programmer,comp.sys.mac.programmer.misc
  404. >Subject: Re: FindWorkBreaks quirky?
  405. ...
  406. >LewisGordonPringle wrote:
  407. >:      That is - if you operate on the text "We are good", and ask it to find the
  408. >: word at position 2, it responds with a word found (2,3).
  409. >
  410. >One of the 7 parameters of FindWordBreaks is "leadingEdge".  It tells
  411. >FindWordBreaks whether you want to find the word before the offset or after
  412. >the offset.  In this case, you have to pass false to leadingEdge.
  413.  
  414.         As far as I can tell - this is not relevant. The leadingEdge is equivilent to adding (or
  415. not) one to the starting position of where you begin searching.
  416.  
  417.  
  418. >:      Now - I can use isspace() (from ctype.h) to tell if the word returned is a
  419. >: REAL word - or one of these phony ones. This is what I am doing for now.
  420. >: But doesn't this negate the usefulness of using this routine to begin with?
  421. >: After all - it would then miss the case of - for example - a double-byte
  422. >: Kanji space.
  423. >
  424. >You can use the Script Manager routine CharacterType() to distinguish the
  425. >spaces.
  426.  
  427.         Yes - thank you kindly. This is what I was really looking for.
  428.  
  429.                                 Lewis.
  430.  
  431.  
  432. - -----------------------------------------------------------------------------
  433. Lewis Gordon Pringle, Jr.                          e-mail: <lewis@sophists.com>
  434. Software Consultant                                 phone:       (508)-543-0041
  435.  
  436. Dogbert: "Always postpone meetings with time-wasting morons."
  437. Dilbert: "How do you do that?"
  438. Dogbert: "Can I get back to you on that?"     -- Scott Adams
  439.  
  440. +++++++++++++++++++++++++++
  441.  
  442. >From Lewis Gordon Pringle, Jr. <lewis@sophists.com>
  443. Date: 29 Jan 1995 04:53:39 GMT
  444. Organization: Sophist Solutions, Inc.
  445.  
  446. In article <resnick-2601951802150001@resnick1.isdn.uiuc.edu> Pete Resnick, presnick@qualcomm.com
  447. writes:
  448. ...
  449. >In article <3g969j$t3n@sundog.tiac.net>, Lewis Gordon Pringle, Jr.
  450. ><lewis@sophists.com> wrote:
  451. >
  452. >>        I'm using the TextUtils toolbox routine FindWordBreaks() in order to
  453. >>word-wrap some text for a texteditor I'm writing. This routine seems to do
  454. >>just what I need - and the documentation indicates that it is intended to
  455. >>be used for such things as word-wrapping text.
  456. >
  457. >If you are using it to word-wrap text, you might consider calling
  458. >StyledLineBreak instead. It finds the appropriate place to break a line
  459. >for wrapping by calling PixelToChar and FindWordBreaks and then looking
  460. >for trailing spaces on the line.
  461.  
  462.         I'm doing more than just wrapping the text, and StyledLineBreak()
  463. isn't sufficiently flexible for my needs - but thanx.
  464.  
  465.  
  466.  
  467.  
  468. >>        This would be awkward - but acceptable - if only the routine notified
  469. >>me somehow which "words" were REALLY words - and which were simply strings
  470. >>of spaces.
  471. >>        
  472. >>Now - I can use isspace() (from ctype.h) to tell if the word returned is a
  473. >>REAL word - or one of these phony ones. This is what I am doing for now.
  474. >>But doesn't this negate the usefulness of using this routine to begin with?
  475. >>After all - it would then miss the case of - for example - a double-byte
  476. >>Kanji space.
  477. >
  478. >Here's a routine that does this for you:
  479. >
  480. ..
  481. >        /* Get the character type for the current character */
  482. >        theType = CharacterType((Ptr)theText++, 0, smCurrentScript);
  483. ...
  484.  
  485.         Again - thank you also. The CharacterType() functions is precisely
  486. what I was looking for.
  487.  
  488.  
  489.                                         Lewis.
  490.  
  491.  
  492.  
  493. - -----------------------------------------------------------------------------
  494. Lewis Gordon Pringle, Jr.                          e-mail: <lewis@sophists.com>
  495. Software Consultant                                 phone:       (508)-543-0041
  496.  
  497. Dogbert: "Always postpone meetings with time-wasting morons."
  498. Dilbert: "How do you do that?"
  499. Dogbert: "Can I get back to you on that?"     -- Scott Adams
  500.  
  501. +++++++++++++++++++++++++++
  502.  
  503. >From h+@metrowerks.com (Jon W{tte)
  504. Date: Sun, 29 Jan 1995 18:27:12 +0100
  505. Organization: The Conspiracy
  506.  
  507. In article <3g969j$t3n@sundog.tiac.net>,
  508. Lewis Gordon Pringle, Jr. <lewis@sophists.com> wrote:
  509.  
  510. >However - it has one very disturbing anomoly. It seems to condider a space
  511. >character to be a word!
  512.  
  513. Yes; series of punctuation is also considered to be a "word"
  514. The easy solution is to just call CharacterType() and check for 
  515. the smIsPunct flag in the result on the first character; if 
  516. it's punctuation, call FindWordBreaks() again starting at the 
  517. end of the found range.
  518.  
  519.  
  520. >Now - I can use isspace() (from ctype.h) to tell if the word returned is a
  521. >REAL word - or one of these phony ones. This is what I am doing for now.
  522. >But doesn't this negate the usefulness of using this routine to begin with?
  523. >After all - it would then miss the case of - for example - a double-byte
  524. >Kanji space.
  525.  
  526. Yes, never mix ANSI string/character functions with the real 
  527. text functions of the ToolBox. Use CharacterType() (formerly 
  528. known as CharType())
  529.  
  530. Cheers,
  531.  
  532.                                         / h+
  533.  
  534.  
  535. --
  536.   Jon Wdtte (h+@metrowerks.com), Hagagatan 1, 113 48 Stockholm, Sweden
  537.  
  538.   CFM 68k - Solutions to yesterdays problems, tomorrow!
  539.  
  540.  
  541. +++++++++++++++++++++++++++
  542.  
  543. >From AppleGG@lamg.com (Gordon Apple)
  544. Date: 01 Feb 1995 17:05:03 GMT
  545. Organization: Los Angeles Macintosh Group BBS
  546.  
  547. I'm using the TextUtils toolbox routine FindWordBreaks() in order to
  548. word-wrap some text for a texteditor I'm writing.*
  549.  
  550. So - big picture - is this the right routine to be using to word-wrap text
  551. in an internationally friendly manner?
  552. - ------------------
  553.  
  554.      How about "StyledLineBreak"?  That's what I am using.  It seems to work
  555. fairly well once you understand how to use it.
  556.  
  557. ---------------------------
  558.  
  559. >From gneufeld@ccs.carleton.ca (Grant Neufeld)
  560. Subject: Looking for Get-Put URL AE suite info
  561. Date: Mon, 30 Jan 1995 20:27:29 GMT
  562. Organization: Carleton Apple Research
  563.  
  564. I've been looking for the documentation on the Get and Put URL apple
  565. events (used by many TCP apps), but have been unsuccessful. I searched
  566. through umich, sumex-aim and a Peter N. Lewis mirror without luck. A
  567. pointer would be appreciated. Thanks.
  568. -- 
  569. gneufeld@ccs.carleton.ca - http://arpp1.carleton.ca/Grant/ - Ottawa, Ontario
  570. My views are too extreme to be those of anyone else. ki'hitwa'm kawa'pamitin
  571.  
  572. +++++++++++++++++++++++++++
  573.  
  574. >From scouten@metrowerks.com (Eric Scouten)
  575. Date: Mon, 30 Jan 1995 16:34:35 -0600
  576. Organization: metrowerks, inc.
  577.  
  578. In article <gneufeld-3001951527300001@192.0.1.2>, gneufeld@ccs.carleton.ca
  579. (Grant Neufeld) wrote:
  580.  
  581. > I've been looking for the documentation on the Get and Put URL apple
  582. > events (used by many TCP apps), but have been unsuccessful. I searched
  583. > through umich, sumex-aim and a Peter N. Lewis mirror without luck. A
  584. > pointer would be appreciated. Thanks.
  585.  
  586. Don't remember the exact URL, but you should look around on
  587. ftp.acns.nwu.edu. John Norstad (author of NewsWatcher) took the lead on
  588. designing this AE suite.
  589.  
  590. -es
  591.  
  592. __________________________________________________________________________
  593. Eric Scouten                                       Constructor Constructor
  594. scouten@metrowerks.com                                     Metrowerks, Inc.
  595.  
  596. Yea, and if It will be done, even in spite,
  597. Then lend Thine hand to the masses,
  598. Lest It be done incorrectly or woefully worse
  599. By those not versed the the ways of the Dogcow.
  600.    - Memoirs of Clarus, the Dogcow
  601.    
  602.  
  603. +++++++++++++++++++++++++++
  604.  
  605. >From gneufeld@ccs.carleton.ca (Grant Neufeld)
  606. Date: Tue, 31 Jan 1995 02:35:57 GMT
  607. Organization: Carleton Apple Research
  608.  
  609. scouten@metrowerks.com (Eric Scouten) wrote:
  610. >
  611. >Don't remember the exact URL, but you should look around on
  612. >ftp.acns.nwu.edu.
  613.  
  614. Right you were:
  615.  
  616.   ftp://ftp.acns.nwu.edu/pub/newswatcher/url-ae-standard.txt
  617.  
  618. -- 
  619. gneufeld@ccs.carleton.ca - http://arpp1.carleton.ca/Grant/ - Ottawa, Ontario
  620. My views are too extreme to be those of anyone else. ki'hitwa'm kawa'pamitin
  621.  
  622. ---------------------------
  623.  
  624. >From mab@baretta.ideas.com (Aaron Barnett)
  625. Subject: Random() replacement anyone?
  626. Date: 26 Jan 1995 10:39:12 -0500
  627. Organization: Ideas, Inc.
  628.  
  629. so has anyone come up with a better random function that they would like 
  630. to post?  has anyone coded anything from a numerical recepies book?
  631.  
  632.  
  633. -- 
  634.  
  635.                                                                       firefly
  636.  
  637. +++++++++++++++++++++++++++
  638.  
  639. >From wilbaden@netcom.com (W.Baden)
  640. Date: Sun, 29 Jan 1995 19:27:22 GMT
  641. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  642.  
  643. Aaron Barnett (mab@baretta.ideas.com) wrote:
  644. : so has anyone come up with a better random function that they would like 
  645. : to post?  has anyone coded anything from a numerical recepies book?
  646.  
  647. No discussion of random number generation would be complete without Donald
  648. Knuth's recommendation.  The enclosed listings untangle his routines from
  649. _The Stanford Graphbase_, the so-called "Volume 3 1/2" of _The Art of
  650. Computer Programming_.
  651.  
  652.    D. E. Knuth, _The Stanford GraphBase_, Addison-Wesley, ISBN 0-201-54275-7
  653.  
  654. After you get the book, get the code for it.  The book tells you how to ftp it.
  655.  
  656. The package handles all objections raised so far.
  657.  
  658. And it's fast.
  659.  
  660. In using these routines I've found the following renaming to be friendlier.
  661.  
  662. # define Random()     gb_next_rand()
  663. # define SetRandom(n) gb_init_rand(n)
  664. # define GetRandom(n) gb_unif_rand(n)
  665.  
  666. Procedamus in pace.  Wil        wilbaden@netcom.com
  667.  
  668. ==== gb_flip.h ====
  669.  
  670. # define gb_next_rand() (*gb_fptr >= 0 ? *gb_fptr-- : gb_flip_cycle())
  671. # define mod_diff(x,y) (((x) - (y)) & 0x7FFFFFFF)
  672. # define two_to_the_31 ((unsigned long) 0x80000000)
  673.  
  674. extern long *gb_fptr;
  675.  
  676. extern long gb_flip_cycle(void);
  677. extern void gb_init_rand(long seed);
  678. extern long gb_unif_rand(long m);
  679. extern int gb_flip(void);
  680.  
  681. ==== gb_flip.c ====
  682.  
  683. /*
  684.  * gb_flip
  685.  * D. E. Knuth, _The Stanford GraphBase_, Addison-Wesley, ISBN 0-201-54275-7
  686.  */
  687.  
  688. # include <stdio.h>
  689. # include "gb_flip.h"
  690.  
  691. /* Private Declarations */
  692.  
  693. static long A[56] = {-1};
  694.  
  695. /* External Declarations */
  696.  
  697. long *gb_fptr = A;
  698.  
  699. # define gb_next_rand() (*gb_fptr >= 0 ? *gb_fptr-- : gb_flip_cycle())
  700.  
  701. /* External Functions */
  702.  
  703. long gb_flip_cycle(void)
  704. {
  705.         register long *ii, *jj;
  706.         
  707.         for (ii = &A[1], jj = &A[32]; jj <= &A[55]; ii++, jj++)
  708.                 *ii = mod_diff(*ii, *jj);
  709.         for (jj = &A[1]; ii<= &A[55]; ii++, jj++)
  710.                 *ii = mod_diff(*ii, *jj);
  711.         gb_fptr = &A[54];
  712.         return A[55];
  713. }
  714.  
  715. void gb_init_rand(long seed)
  716. {
  717.         register long i;
  718.         register long prev = seed, next = 1;
  719.         
  720.         seed = prev = mod_diff(prev, 0);
  721.         A[55] = prev;
  722.         for (i = 21; i; i =(i + 21) % 55) {
  723.                 A[i] = next;
  724.                 /* Compute a new next value. */
  725.                 next = mod_diff(prev, next);
  726.                 if (seed & 1)
  727.                         seed = 0x40000000 + (seed >> 1);
  728.                 else
  729.                         seed >>= 1;
  730.                 next = mod_diff(next, seed);
  731.  
  732.                 prev = A[i];
  733.         }
  734.         /* Get the array values ``warmed up''. */
  735.         (void) gb_flip_cycle();
  736.         (void) gb_flip_cycle();
  737.         (void) gb_flip_cycle();
  738.         (void) gb_flip_cycle();
  739.         (void) gb_flip_cycle();
  740. }
  741.  
  742. long gb_unif_rand(long m)
  743. {
  744.         register unsigned long t = two_to_the_31 - (two_to_the_31 % m);
  745.         register long r;
  746.         
  747.         do {
  748.                 r = gb_next_rand();
  749.         } while (t <= (unsigned long) r);
  750.         return r % m;
  751. }
  752.  
  753. int gb_flip(void) 
  754. {
  755.         int j;
  756.         
  757.         gb_init_rand(-314159L);
  758.         if (gb_next_rand() != 119318998) {
  759.                 fprintf(stderr,"Failure on the first try.\n");
  760.                 return -1;
  761.         }
  762.         for (j = 1; j <= 133; j++) gb_next_rand();
  763.         if (gb_unif_rand(0x55555555L) != 748103812) {
  764.                 fprintf(stderr,"Failure on the second try.\n");
  765.                 return -2;
  766.         }
  767.         /* fprintf(stderr,"OK, the gb_flip_routines seem to work.\n"); */
  768.         return 0;
  769. }
  770.  
  771.  
  772. ---------------------------
  773.  
  774. >From cwong@qualcomm.com (Clarence Wong)
  775. Subject: UnloadSeg - unloading code segments
  776. Date: Tue, 24 Jan 1995 14:35:07 -0800
  777. Organization: Qualcomm
  778.  
  779. The Segment Manager chapter in New Inside Mac: Processes says:
  780.  
  781. You can call UnloadSeg at any time except when you are executing code
  782. contained in the segment to be unloaded. A typical strategy is to unload
  783. all code segments except segment 1 and any other essential code segments
  784. each time through your applicationUs main event loop.
  785.  
  786. So, say you have the following code in main.c:
  787.  
  788.  
  789. void unloadSegments ()
  790.  
  791. {
  792.         UnloadSeg ((void *) someFunctionInSeg2);
  793.         UnloadSeg ((void *) anotherFunctionInSeg3);
  794. }
  795.  
  796. void eventLoop ()
  797.  
  798. {
  799.         EventRecord     theEvent;
  800.         OSErr           theError;
  801.         long            sleepTime;
  802.         Boolean         gotAnEvent;
  803.         
  804.                 while (!gQuitting) {
  805.                         theError = noErr;
  806.                         sleepTime = gPeriodicTask ? 1 : GetDblTime ();
  807.                         if (gInBackground)
  808.                                 sleepTime = 120L;
  809.                         gotAnEvent = WaitNextEvent (everyEvent, &theEvent, sleepTime,
  810. gCursorRgn);
  811.                         if (gotAnEvent)
  812.                                 theError = doEvent (&theEvent);
  813.                         if (!theError)
  814.                                 theError = doPeriodicTask ();
  815.                         if (theError)
  816.                                 reportAnError (theError);
  817.                         unloadSegments ();
  818.         }
  819. }
  820.  
  821.  
  822. What happens if there isn't enough memory to load a segment into memory? I
  823. get a system error 15 (segment loader error). Do I need to patch
  824. _LoadSegment to check for enough memory? Even if I do, the Segment Manager
  825. automatically calls LoadSegment; how do I return this error to my main
  826. eventloop? I've seen some code where all the code resources are loaded,
  827. made unpurgeable and locked at initialization. That makes sense for smaller
  828. applications, but for larger applications, Inside Mac's advice looks
  829. better. Are they not telling the whole story or is there something I've
  830. missed? Scott Knaster's book says the same thing.
  831.  
  832. +++++++++++++++++++++++++++
  833.  
  834. >From crawford@scipp.ucsc.edu (Mike Crawford)
  835. Date: 25 Jan 1995 01:14:37 GMT
  836. Organization: Santa Cruz Institute for Particle Physics
  837.  
  838. Regarding the problem of running out of memory when loading a segment...
  839.  
  840. There are various options:
  841.  
  842. 1. Crash.  A frequently used solution
  843.  
  844. 2. Make the crashes rare by setting the application partition to an amount
  845. that seems safe based on your testing.  Probably the most popular.
  846.  
  847. 3. Test that there is enough memory available before making any intersegment
  848. call.  Most reliably, but no one does this.  One could do this by using
  849. GetResource( 'CODE', kWhatever) and checking that the returned handle is
  850. not nil.
  851.  
  852. 4. Do  #3, but only do at at times when you think you're likely to be out of
  853. memory.
  854.  
  855. 5.  Once through the main event loop, check the available memory, and if it
  856. is less than a certain amount, advise the user to close some windows.
  857.  
  858. 6. Probably the most practical, semireliable solution; allocate a block which
  859. is bigger than any of your segments (bigger than 32K).  Maybe as big as 
  860. several segments.  Use the grow zone proc you can pass into SetGrowZone.  If
  861. your proc is called, free the block you have stashed, and set a flag that is
  862. checked during the main event loop.  If you see the flag set, advise the user
  863. to save and quit.  
  864.  
  865. Of course, if you can't load the segment because a server went down, or you
  866. broke the network cable, well, you're out of luck.
  867.  
  868.  
  869.  
  870.  
  871.  
  872. -- 
  873. Mike Crawford           
  874. crawford@scruznet.com     <-- note change of address.
  875. crawford@maxwell.ucsc.edu <-- Finger Me here for PGP Public Key
  876.  
  877. +++++++++++++++++++++++++++
  878.  
  879. >From cwong@qualcomm.com (Clarence Wong)
  880. Date: Wed, 25 Jan 1995 13:29:19 -0800
  881. Organization: Qualcomm
  882.  
  883. In article <3g48lt$1mq@darkstar.UCSC.EDU>, crawford@scipp.ucsc.edu (Mike
  884. Crawford) wrote:
  885.  
  886. > Regarding the problem of running out of memory when loading a segment...
  887. > There are various options:
  888. > 1. Crash.  A frequently used solution
  889. > 2. Make the crashes rare by setting the application partition to an amount
  890. > that seems safe based on your testing.  Probably the most popular.
  891. > 3. Test that there is enough memory available before making any intersegment
  892. > call.  Most reliably, but no one does this.  One could do this by using
  893. > GetResource( 'CODE', kWhatever) and checking that the returned handle is
  894. > not nil.
  895. > 4. Do  #3, but only do at at times when you think you're likely to be out of
  896. > memory.
  897. > 5.  Once through the main event loop, check the available memory, and if it
  898. > is less than a certain amount, advise the user to close some windows.
  899. > 6. Probably the most practical, semireliable solution; allocate a block which
  900. > is bigger than any of your segments (bigger than 32K).  Maybe as big as 
  901. > several segments.  Use the grow zone proc you can pass into SetGrowZone.  If
  902. > your proc is called, free the block you have stashed, and set a flag that is
  903. > checked during the main event loop.  If you see the flag set, advise the user
  904. > to save and quit.  
  905.  
  906. Thanks for the response. I think I did miss something important in NIM:
  907. Memory. I was doing option 1,2, 5 and 6 and was thinking about doing option
  908. 3. The problem with checking if there is enough memory before calling any
  909. intersegment call is that it is a real pain-- this is why no one does this.
  910.  
  911. Instead, Inside Mac recommends maintaining a memory cushion and checking if
  912. there is enough memory for any dynamic memory allocation (NewPtr and
  913. NewHandle calls) you do. Basically, you write wrapper functions for the two
  914. calls that check memory before they allocate. If memory request < 
  915. (available memory + memory cushion) then the request is granted. The
  916. growzone is temporarily set to nil so that emergency memory isn't purged.
  917. The problem I was experiencing was that memory was being hogged by my
  918. dynamic memory calls while the segment loader starved.
  919.  
  920. -Clarence
  921.  
  922. +++++++++++++++++++++++++++
  923.  
  924. >From cwong@qualcomm.com (Clarence Wong)
  925. Date: Wed, 25 Jan 1995 13:58:12 -0800
  926. Organization: Qualcomm
  927.  
  928. In article <cwong-250195132919@cwong.qualcomm.com>, cwong@qualcomm.com
  929. (Clarence Wong) wrote:
  930.  
  931. > In article <3g48lt$1mq@darkstar.UCSC.EDU>, crawford@scipp.ucsc.edu (Mike
  932. > Crawford) wrote:
  933. > > Regarding the problem of running out of memory when loading a segment...
  934. > > 
  935. > > There are various options:
  936. > > 
  937. > > 1. Crash.  A frequently used solution
  938. > > 
  939. > > 2. Make the crashes rare by setting the application partition to an amount
  940. > > that seems safe based on your testing.  Probably the most popular.
  941. > > 
  942. > > 3. Test that there is enough memory available before making any intersegment
  943. > > call.  Most reliably, but no one does this.  One could do this by using
  944. > > GetResource( 'CODE', kWhatever) and checking that the returned handle is
  945. > > not nil.
  946. > > 
  947. > > 4. Do  #3, but only do at at times when you think you're likely to be out of
  948. > > memory.
  949. > > 
  950. > > 5.  Once through the main event loop, check the available memory, and if it
  951. > > is less than a certain amount, advise the user to close some windows.
  952. > > 
  953. > > 6. Probably the most practical, semireliable solution; allocate a block which
  954. > > is bigger than any of your segments (bigger than 32K).  Maybe as big as 
  955. > > several segments.  Use the grow zone proc you can pass into SetGrowZone.  If
  956. > > your proc is called, free the block you have stashed, and set a flag that is
  957. > > checked during the main event loop.  If you see the flag set, advise the user
  958. > > to save and quit.  
  959. > > 
  960. > Thanks for the response. I think I did miss something important in NIM:
  961. > Memory. I was doing option 1,2, 5 and 6 and was thinking about doing option
  962. > 3. The problem with checking if there is enough memory before calling any
  963. > intersegment call is that it is a real pain-- this is why no one does this.
  964. > Instead, Inside Mac recommends maintaining a memory cushion and checking if
  965. > there is enough memory for any dynamic memory allocation (NewPtr and
  966. > NewHandle calls) you do. Basically, you write wrapper functions for the two
  967. > calls that check memory before they allocate. If memory request < 
  968. > (available memory + memory cushion) then the request is granted. The
  969. > growzone is temporarily set to nil so that emergency memory isn't purged.
  970. > The problem I was experiencing was that memory was being hogged by my
  971. > dynamic memory calls while the segment loader starved.
  972. > -Clarence
  973.  
  974. Oooops. Should read: If memory request < (available memory - memory
  975. cushion) then the request is granted.
  976.  
  977. +++++++++++++++++++++++++++
  978.  
  979. >From gurgle@dnai.com (Pete Gontier)
  980. Date: Thu, 26 Jan 1995 18:15:58 -0700
  981. Organization: cellular
  982.  
  983. In article <3g48lt$1mq@darkstar.UCSC.EDU>,
  984. crawford@scipp.ucsc.edu (Mike Crawford) wrote:
  985.  
  986. > Regarding the problem of running out of memory when loading a segment...
  987. > There are various options:
  988.  
  989. You forgot:
  990.  
  991. 7. Don't load segments.
  992.  
  993. Have CodeWarrior or MPW make all your segments go away by linking all your
  994. code into a single resource. Alternately, or if you are using a Symantec
  995. product, mark all your segments pre-load and locked.
  996.  
  997. Of course, this is not a solution for someone who actually wants to unload
  998. segments, but most often what people want is to make System Error 15 go
  999. away, and they don't much care how they do it.
  1000.  
  1001. ______________________________________________________________________________
  1002.  Pete Gontier -- MacZealotry, Ink. -- gurgle@dnai.com
  1003.  
  1004.  "It's great to work for a company that lets you build good software 
  1005.   and doesn't give you any shit..."
  1006.              -- John McEnerney, Metrowerks PowerPC Product Architect
  1007.  
  1008. +++++++++++++++++++++++++++
  1009.  
  1010. >From rickgenter@aol.com (RickGenter)
  1011. Date: 31 Jan 1995 08:20:48 -0500
  1012. Organization: America Online, Inc. (1-800-827-6364)
  1013.  
  1014. >>>
  1015. You forgot:
  1016.  
  1017. 7. Don't load segments.
  1018.  
  1019. Have CodeWarrior or MPW make all your segments go away by linking all your
  1020. code into a single resource. Alternately, or if you are using a Symantec
  1021. product, mark all your segments pre-load and locked.
  1022. <<<
  1023.  
  1024. The problem I have with this solution is that it tends to lead to code
  1025. bloat. I may have a lot of code in my application that is rarely executed.
  1026. (For example, look at most of Microsoft Word/Excel/etc.) Through the
  1027. judicious use of segments, I can make my application have a *much* smaller
  1028. memory footprint than it would have otherwise.
  1029.  
  1030. Rick Genter
  1031.  
  1032. +++++++++++++++++++++++++++
  1033.  
  1034. >From jens_alfke@powertalk.apple.com (Jens Alfke)
  1035. Date: Thu, 26 Jan 1995 22:27:45 GMT
  1036. Organization: Apple Computer, Inc.
  1037.  
  1038. In article <cwong-250195132919@cwong.qualcomm.com>, cwong@qualcomm.com
  1039. (Clarence Wong) wrote:
  1040. > Instead, Inside Mac recommends maintaining a memory cushion and checking if
  1041. > there is enough memory for any dynamic memory allocation (NewPtr and
  1042. > NewHandle calls) you do. Basically, you write wrapper functions for the two
  1043. > calls that check memory before they allocate. If memory request < 
  1044. > (available memory + memory cushion) then the request is granted. The
  1045. > growzone is temporarily set to nil so that emergency memory isn't purged.
  1046.  
  1047. This will work, but I find it much easier (and faster) to leave the GZProc
  1048. in place and let it tell me when there's not enough memory. E.g:
  1049.  
  1050. Handle MyNewHandle( Size s )
  1051. {
  1052.   gCanEatCushion = false;
  1053.   Handle h = NewHandle(s);
  1054.   gCanEatCushion = true;
  1055.   if( !h )
  1056.     THROW( MemError() );
  1057. }
  1058.  
  1059. gCanEatCushion is checked in the GZproc; if it's false, it will not
  1060. release the cushion. This means that the app's memory allocations will not
  1061. eat into the cushion space, but memory allocated by other things (such as
  1062. the Toolbox) can.
  1063.  
  1064.  
  1065. Jens Alfke_________OpenDoc Geometer_________jens_alfke@powertalk.apple.com
  1066.                                               OpenDoc info: FTP to cil.org
  1067.  
  1068.          Visit Scenic Flood Control Dam No. 3.      
  1069.  
  1070. +++++++++++++++++++++++++++
  1071.  
  1072. >From jens_alfke@powertalk.apple.com (Jens Alfke)
  1073. Date: Thu, 26 Jan 1995 22:30:15 GMT
  1074. Organization: Apple Computer, Inc.
  1075.  
  1076. > In article <3g48lt$1mq@darkstar.UCSC.EDU>, crawford@scipp.ucsc.edu (Mike
  1077. > Crawford) wrote:
  1078. > > Regarding the problem of running out of memory when loading a segment...
  1079. > > 
  1080. > > There are various options:
  1081.  
  1082. You didn't mention the option of patching _LoadSeg, which is taken by
  1083. MacApp and the Finder; I believe both create a subheap especially for code
  1084. segments, which makes it easier to assure that a segment can always be
  1085. loaded.
  1086. Metrowerks' 68k runtime environment also patches _LoadSeg for other
  1087. reasons, but unfortunately they don't allow the programmer to hook into it
  1088. to do things like this.
  1089.  
  1090.  
  1091. Jens Alfke_________OpenDoc Geometer_________jens_alfke@powertalk.apple.com
  1092.                                               OpenDoc info: FTP to cil.org
  1093.  
  1094.          Visit Scenic Flood Control Dam No. 3.      
  1095.  
  1096. +++++++++++++++++++++++++++
  1097.  
  1098. >From rmah@panix.com (Robert Mah)
  1099. Date: Wed, 01 Feb 1995 17:36:48 -0500
  1100. Organization: One Step Beyond
  1101.  
  1102. jens_alfke@powertalk.apple.com (Jens Alfke) wrote:
  1103.  
  1104. ) Metrowerks' 68k runtime environment also patches _LoadSeg for other
  1105. ) reasons, but unfortunately they don't allow the programmer to hook
  1106. ) into it to do things like this.
  1107.  
  1108. I believe this patch has been removed in CW-5 because of lot's of user
  1109. complaints (mine among them).
  1110.  
  1111. Cheers,
  1112. Rob
  1113. _______________________________________________________________________
  1114. Robert S. Mah        Macintosh Software Development     +1 212 947 6507
  1115. One Step Beyond         and Network Consulting           rmah@panix.com
  1116.  
  1117. ---------------------------
  1118.  
  1119. >From bb@lightside.com (Bob Bradley)
  1120. Subject: Where to send applications I've written?
  1121. Date: 1 Feb 1995 07:46:30 GMT
  1122. Organization: SPC
  1123.  
  1124. Where would I send software I've written to get distributed to the major
  1125. FTP sites (and possibly commerical sites)? I remember there being
  1126. somewhere to send mail (MacGifts?) but, I don't know the exact e-mail
  1127. address. I wrote something (freeware) that I'd like to get out but, can't
  1128. find the address, and I couldn't find anything in the CSMP FAQ. I'd
  1129. appreciate any info.
  1130.  
  1131. Thanks
  1132.  
  1133. +++++++++++++++++++++++++++
  1134.  
  1135. >From Matt Slot <fprefect@engin.umich.edu>
  1136. Date: 1 Feb 1995 08:34:40 GMT
  1137. Organization: University of Michigan
  1138.  
  1139. Try mailing your binhexes (with appropriate titles/headers) to:
  1140.  
  1141.         macgifts@sumex-aim.stanford.edu
  1142.  
  1143. This hits Sumex, MacArchives, mirrors, and assorted sites along
  1144. the way. Its the best way to hit a large Internet audience with
  1145. one mailing.
  1146.  
  1147. Matt
  1148.  
  1149. ---------------------------
  1150.  
  1151. End of C.S.M.P. Digest
  1152. **********************
  1153.